#include <iostream>
#include <vector>
using namespace std;

// void print(const vector<int>& v)
// {
//     auto it = v.begin();
//     while(it != v.end())
//     {
//         cout << *it << " ";
//         ++it;
//     }
//     cout << endl;
// }
//
// // template <typename Container>
// template <class Container>
// void Print(const Container& v)
// {
//     auto it = v.begin();
//     while(it != v.end())
//     {
//         cout << *it << " ";
//         ++it;
//     }
//     cout << endl;
// }

// class A
// {
// public:
//     int begin()
//     {
//         return 0;
//     }
//     static int const_iterator;
// };
//
// int A::const_iterator = 1;
//
// int main()
// {
//     A aa;
//     A::const_iterator it = aa.begin();
// }

// int main()
// {
//     vector<int> v;
//     v.push_back(1);
//     v.push_back(2);
//     v.push_back(3);
//     Print(v);
//     return 0;
// }

// template<class T, size_t N>
// class Stack
// {
// private:
//     T _data[N];
//     int _top;
// };
//
// int main()
// {
//     Stack<int, 10> st1;
//     Stack<int, 20> st2;
//
//     return 0;
// }

template<class T>
bool Less(T left, T right)
{
    return left < right;
}

template<>
bool Less<Date*>(Date* left, Date* right)
{
    return *left < *right;
}

int main()
{
    cout << Less(1, 2) << endl;

    Date d1(2025, 1, 14);
    Date d2(2025, 1, 15);
    cout << Less(d1, d2) << endl;

    Date* p1 = &d1;
    Date* p2 = &d2;
    cout << Less(p1, p2) << endl;

    return 0;
}

template<class T1, class T2>
class Date
{
public:
    Date()
    {
        cout << "Date<T1, T2>" << endl;
    }
private:
    T1 _d1;
    T2 _d2;
};

template<>
class Date<int, char>
{
public:
    Date()
    {
        cout << "Date<int, char>" << endl;
    }
private:
    int _d1;
    char _d2;
};

void TestVector()
{
    Date<int, int> d1;
    Date<int, char> d2;
}

template<class T1, class T2>
class Date<T1*, T2*>
{
public:
    Date()
    {
        cout << "Date<T1*, T2*>" << endl;
    }
private:
    T1 _d1;
    T2 _d2;
};

template<class T1, class T2>
class Date<T1&, T2&>
{
public:
    Date(const T1& d1, const T2& d2)
        :_d1(d1)
        ,_d2(d2)
    {
        cout << "Date<T1&, T2&>" << endl;
    }
private:
    T1& _d1;
    T2& _d2;
};

















